* RunCode.PRG - Run code block interpreter. * Version 2.00 * * Copyright (c) 1998-1999 Microsoft Corp. * 1 Microsoft Way * Redmond, WA 98052 * * Description: * Runs a block of VFP code via macros without compilation. * * Parameter list: * cCode: Code to execute or file name that contains code to execute * lFile: Specifies source file mode. * .F./Empty = Code is specified by cCode. * .T. = Code is imported from specified file via cCode value. * lIgnoreErrors: Specifies error handling mode. * .F./Empty = Errors are trapped and displayed in a wait window. * .T. = All errors are ignored. LPARAMETERS __tcCode,__tlFile,__tvIgnoreErrors LOCAL __lcCode,__lcOnError,__llArrayCode,__lcLine,__lnLine,__lcLine2,__llVFP60 LOCAL __lcCommand,__lcExpr,__lcChar,__lnAtPos,__lnAtPos2,__lnOccurrence LOCAL __lnLineTotal,__llTextMode,__lcLastOnError,__lvResult LOCAL __lcDoExpr,__lnDoLine,__lnDoLineTotal,__lnDoStackCount LOCAL __lcForExpr,__lnForMax,__lnForStep,__lnForLine,__lnForLineTotal,__lnForStackCount LOCAL __lcIfExpr,__llIfExpr,__lnIfLine,__lnIfLineTotal,__lnIfStackCount LOCAL __laLines[1],__laForLines[1],__laIfLines[1],__laDoLines[1] EXTERNAL ARRAY __tcCode,__laLines,__laForLines,__laIfLines,__laDoLines #DEFINE TAB CHR(9) #DEFINE LF CHR(10) #DEFINE CR CHR(13) #DEFINE CR_LF CR+LF IF VARTYPE(__tvIgnoreErrors)=="C" __lcOnError=ALLTRIM(__tvIgnoreErrors) ELSE __lcOnError=IIF(__tvIgnoreErrors,"=.F.","__") ENDIF __llVFP60=" 06.0"$VERSION() IF NOT __llVFP60 __lcLastOnError=ON("ERROR") DO CASE CASE __lcOnError=="__" ON ERROR __RunCodeError(ERROR(),0,"RunCode","",MESSAGE()) CASE __lcOnError=="=.F." ON ERROR =.F. CASE EMPTY(__lcOnError) ON ERROR OTHERWISE ON ERROR &__lcOnError ENDCASE __lvResult=.T. IF __tlFile __lcCode="" __lcCode=ALLTRIM(FILETOSTR(__tcCode)) ELSE __lcCode=IIF(VARTYPE(__tcCode)=="C",__tcCode,"") ENDIF IF LEFT(__lcCode,1)==";" __lcCode=STRTRAN(__lcCode,";",CR_LF) ENDIF __lvResult=EVALUATE("ExecScript(__lcCode)") IF EMPTY(__lcLastOnError) ON ERROR ELSE ON ERROR &__lcLastOnError ENDIF RETURN __lvResult ENDIF __llArrayCode=(TYPE("__tcCode[1]")=="C") IF __llArrayCode __lnLineTotal=ACOPY(__tcCode,__laLines) ELSE IF VARTYPE(__tcCode)#"C" OR EMPTY(__tcCode) RETURN ENDIF IF __tlFile __lcCode="" __lcCode=ALLTRIM(FILETOSTR(__tcCode)) IF EMPTY(__lcCode) RETURN ENDIF ELSE __lcCode=ALLTRIM(__tcCode) ENDIF IF LEFT(__lcCode,1)==";" __lcCode=STRTRAN(__lcCode,";",CR_LF) ENDIF __lnLineTotal=ALINES(__laLines,__lcCode) IF __lnLineTotal=0 RETURN ENDIF PRIVATE __lcLastLine __lcLastLine="" __lnLine=0 DO WHILE __lnLine<__lnLineTotal __lnLine=__lnLine+1 __lcLine=ALLTRIM(__laLines[__lnLine]) __lnAtPos=AT("&"+"&",__lcLine) IF __lnAtPos>0 __lcLine=ALLTRIM(LEFT(__lcLine,__lnAtPos-1)) ENDIF DO WHILE .T. __lcChar=LEFT(__lcLine,1) IF __lcChar==" " OR __lcChar==TAB __lcLine=ALLTRIM(SUBSTR(__lcLine,2)) LOOP ENDIF __lcChar=RIGHT(__lcLine,1) IF __lcChar==" " OR __lcChar==TAB __lcLine=TRIM(LEFT(__lcLine,LEN(__lcLine)-1)) LOOP ENDIF EXIT ENDDO IF EMPTY(__lcLine) OR LEFT(__lcLine,1)=="*" OR LEFT(__lcLine,1)=="#" OR ; LEFT(__lcLine,2)==("&"+"&") OR UPPER(LEFT(__lcLine,4))=="NOTE" OR ; LEFT(__lcLine,4)=="